package com.itany.reflex;

import java.lang.reflect.Field;
import java.util.Arrays;

/**
 * Author:石小俊
 * Date: 2022/11/2 14:45
 */
public class Test04 {

    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        Class c = Student.class;
        // 获取当前类以及其父类中所有public修饰的属性
        Field[] fields = c.getFields();
        System.out.println("当前类以及其父类的public修饰的属性:"+Arrays.toString(fields));

        // 获取当前类的所有属性
        fields = c.getDeclaredFields();
        System.out.println("当前类所有属性"+Arrays.toString(fields));

        // 获取当前类以及其父类中public修饰的指定属性
        Field age = c.getField("age");
        System.out.println("age属性:"+age);

        // 获取当前类中指定的属性
        Field major = c.getDeclaredField("major");
        System.out.println("major:"+major);
        Field no = c.getDeclaredField("no");
        System.out.println("no:"+no);

        // 为指定属性赋值
        Student student = new Student();
        Student student2 = new Student("220910002","软件开发");
        no.set(student,"220910001");
        // 由于major是被private所修饰的属性
        // 因此,想要通过反射为其赋值,必须破坏其封装原则
        // 设置取消权限控制检查,访问属性时忽略访问控制符
        // 只有private修饰的属性需要设置,其他修饰符不需要
        major.setAccessible(true);
        major.set(student,"计算机科学与技术");

        System.out.println("no的值:"+no.get(student));
        System.out.println("major的值:"+major.get(student2));

        System.out.println(student);
    }

}
